package com.yc.Testjvm.classload.demo;

import java.lang.reflect.Method;

/**
 * JavaClass 执行工具
 * @author Administrator
 *
 */
public class JavaClassExecuter {

	/**
	 * 执行外部传过来的代表一个java类的byte数组<br>
	 * 将输入类的byte数组中代表java.lang.System的CONSTANT_Utf8_info常量修改为劫持后的HackSystem类
	 * 执行方法为该类的static main(String[] args)方法，输出结果为该类向System.out/err输出信息
	 * @param classByte	 代表一个java类的byte数组
	 * @return	执行结果
	 */
	public static String execute(byte[] classByte) {
		HackSystem.clearBuffer();
		ClassModifier cm = new ClassModifier(classByte);
		byte[] modiBytes = cm.modifyUTF8Constant("java/lang/System", "com/yc/Testjvm/classload/demo/HackSystem");
		HotSwapClassLoader loader = new HotSwapClassLoader();
		Class clazz = loader.loadByte(modiBytes);
		try {
			Method method = clazz.getMethod("main", new Class[] {String[].class});
			//很奇怪这里只能传这样的参数，反射中因为参数问题经常会报java.lang.IllegalArgumentException: wrong number of arguments
			method.invoke(null, new String[] {null});
		} catch (Throwable e) {
			e.printStackTrace(HackSystem.out);
		}
		return HackSystem.getBufferString();
		
	}
}
